package org.db.ui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import java.util.List;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.db.Manager;
import org.db.dao.BauwerkslinienDAO;
import org.db.dao.GleisDAO;
import org.db.dao.HoehenlinienDAO;
import org.db.dao.KruemmungslinienDAO;
import org.db.dao.LageskizzenGVPDAO;
import org.db.dao.LageskizzenWeichenDAO;
import org.db.dao.UeberhoehungslinienDAO;
import org.db.dao.query.QueryResult;

/**
 * Klasse zur km- Abfrag
 * 
 * @author Lutz
 */
public class AbfragenDialog extends JDialog
		implements
			ActionListener,
			KeyListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = -3327203841333991083L;

	private static final String StationException = "Bitte überprüfen Sie die eingegebene Stationierung!";

	private DecimalFormat format1 = new DecimalFormat("0.000");

	private DecimalFormat format2 = new DecimalFormat("0.00");

	public AbfragenDialog() {
		initComponents();
	}

	@SuppressWarnings({"rawtypes", "unchecked"})
	private void initComponents() {

		jLabel1 = new javax.swing.JLabel();
		jLabel2 = new javax.swing.JLabel();
		jTextFieldS0 = new DoubleTextField();
		jLabel3 = new javax.swing.JLabel();
		jLabelBauwerk = new javax.swing.JLabel();
		jLabel4 = new javax.swing.JLabel();
		jLabelHoehe = new javax.swing.JLabel();
		jLabelElementHoehe = new javax.swing.JLabel();
		jLabel5 = new javax.swing.JLabel();
		jLabelUeberh = new javax.swing.JLabel();
		jLabelElementUeberh = new javax.swing.JLabel();
		jLabel6 = new javax.swing.JLabel();
		jLabelElementKruemmung = new javax.swing.JLabel();
		jButtonStart = new javax.swing.JButton();
		jButtonClose = new javax.swing.JButton();
		jLabelElementKruemmungNext = new javax.swing.JLabel();
		jLabel7 = new javax.swing.JLabel();
		jLabelHoeheBauwerk = new javax.swing.JLabel();
		jLabelBauwBes = new javax.swing.JLabel();
		jLabelGleisAbstand = new javax.swing.JLabel();
		jScrollPane1 = new javax.swing.JScrollPane();
		table = new LageskizzenGVPTable(false);
		jLabelWeichenNr = new javax.swing.JLabel();
		jLabelWeichenNr1 = new javax.swing.JLabel();
		jLabelWeichenBez = new javax.swing.JLabel();
		jComboBoxGleis = new javax.swing.JComboBox();
		jLabelBauwerkStationA = new javax.swing.JLabel();
		jLabelBauwerkStationE = new javax.swing.JLabel();
		jLabelUeberhStationA = new javax.swing.JLabel();
		jLabelUeberhStationE = new javax.swing.JLabel();
		jLabelKruemmungStationA = new javax.swing.JLabel();
		jLabelKruemmungStationE = new javax.swing.JLabel();

		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

		setPreferredSize(new java.awt.Dimension(1200, 800));
		// setResizable(false);

		jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18));
		jLabel1.setText("km- Abfrage");

		jLabel2.setFont(new java.awt.Font("Tahoma", 3, 14));
		jLabel2.setText("Stationierung");

		jTextFieldS0
				.setToolTipText("Eingabe der Stationierung für die die \ngesuchten Elemente angezeigt werden sollen.");
		jTextFieldS0.requestFocusInWindow();

		jLabel3.setFont(new java.awt.Font("Tahoma", 1, 14));
		jLabel3.setText("Bauwerkslinie");
		jLabel3.setBorder(javax.swing.BorderFactory
				.createLineBorder(new java.awt.Color(0, 0, 0)));

		jLabelBauwerk.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelBauwerk.setText("Bauwerk:");

		jLabel4.setFont(new java.awt.Font("Tahoma", 1, 14));
		jLabel4.setText("Höhenlinie");
		jLabel4.setBorder(javax.swing.BorderFactory
				.createLineBorder(new java.awt.Color(0, 0, 0)));

		jLabelHoehe.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelHoehe.setText("Höhe = ");

		jLabelElementHoehe.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelElementHoehe.setText("Element:");

		jLabel5.setFont(new java.awt.Font("Tahoma", 1, 14));
		jLabel5.setText("Überhöhungslinie");
		jLabel5.setBorder(javax.swing.BorderFactory
				.createLineBorder(new java.awt.Color(0, 0, 0)));

		jLabelUeberh.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelUeberh.setText("Überhöhung = 0");

		jLabelElementUeberh.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelElementUeberh.setText("Element:");

		jLabel6.setFont(new java.awt.Font("Tahoma", 1, 14));
		jLabel6.setText("Krümmungslinie");
		jLabel6.setBorder(javax.swing.BorderFactory
				.createLineBorder(new java.awt.Color(0, 0, 0)));

		jLabelElementKruemmung.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelElementKruemmung.setText("Element:");

		jButtonStart.setFont(new java.awt.Font("Tahoma", 1, 12));
		jButtonStart.setText("Abfrage starten");
		jButtonStart
				.setToolTipText("Startet die Abfrage zur oben eingegebenen Stationierung.");
		jButtonStart.addActionListener(this);
		jButtonStart.addKeyListener(this);

		jButtonClose.setFont(new java.awt.Font("Tahoma", 1, 12));
		jButtonClose.setText("Abfrage beenden");
		jButtonClose
				.setToolTipText("Beenden der km- Abfrage. Zurück zum Hauptmenü.");
		jButtonClose.addActionListener(this);
		jButtonClose.addKeyListener(this);

		jLabelElementKruemmungNext.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelElementKruemmungNext.setText("");

		jLabel7.setFont(new java.awt.Font("Tahoma", 1, 14));
		jLabel7.setText("Lageskizze");
		jLabel7.setBorder(javax.swing.BorderFactory
				.createLineBorder(new java.awt.Color(0, 0, 0)));

		jLabelHoeheBauwerk.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelHoeheBauwerk.setText("Höhe Bauwerk:");

		jLabelBauwBes.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelBauwBes.setText("Besonderheiten:");

		jLabelGleisAbstand.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelGleisAbstand.setText("Gleisabstand =");

		jScrollPane1.setViewportView(table);

		jLabelWeichenNr.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelWeichenNr.setText("WeichenNr.:");

		jLabelWeichenNr1.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelWeichenNr1.setText("Stationierung:");

		jLabelWeichenBez.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelWeichenBez.setText("WeichenBez:");

		// Laden der Gleise
		jComboBoxGleis.setFont(new java.awt.Font("Tahoma", 1, 12));
		List<GleisDAO> gleise = Manager.getInstance().getGleisElemente();
		jComboBoxGleis.setModel(new javax.swing.DefaultComboBoxModel(
				(GleisDAO[]) gleise.toArray(new GleisDAO[gleise.size()])));
		Manager.getInstance().setCurrentGleis(gleise.get(0));
		jComboBoxGleis.addItemListener(new ItemListener() {

			@Override
			public void itemStateChanged(ItemEvent e) {
				Manager.getInstance().setCurrentGleis(
						(GleisDAO) jComboBoxGleis.getSelectedItem());

			}
		});

		jLabelBauwerkStationA.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelBauwerkStationA.setText("Stationierung von:");

		jLabelBauwerkStationE.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelBauwerkStationE.setText("Stationierung bis:");

		jLabelUeberhStationA.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelUeberhStationA.setText("Stationierung von:");

		jLabelUeberhStationE.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelUeberhStationE.setText("Stationierung bis:");

		jLabelKruemmungStationA.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelKruemmungStationA.setText("Stationierung von:");

		jLabelKruemmungStationE.setFont(new java.awt.Font("Tahoma", 1, 12));
		jLabelKruemmungStationE.setText("Stationierung bis:");

		JPanel wrapper = new JPanel();
		// javax.swing.GroupLayout layout = new
		// javax.swing.GroupLayout(getContentPane());
		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(wrapper);
		wrapper.setLayout(layout);
		getContentPane().add(new JScrollPane(wrapper));
		// getContentPane().setLayout(layout);
		layout.setHorizontalGroup(layout
				.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.LEADING)
																				.addComponent(
																						jLabel1)
																				.addGroup(
																						layout.createSequentialGroup()
																								.addGroup(
																										layout.createParallelGroup(
																												javax.swing.GroupLayout.Alignment.TRAILING)
																												.addComponent(
																														jComboBoxGleis,
																														javax.swing.GroupLayout.PREFERRED_SIZE,
																														115,
																														javax.swing.GroupLayout.PREFERRED_SIZE)
																												.addComponent(
																														jLabel2,
																														javax.swing.GroupLayout.PREFERRED_SIZE,
																														103,
																														javax.swing.GroupLayout.PREFERRED_SIZE))
																								.addGap(4,
																										4,
																										4)
																								.addComponent(
																										jTextFieldS0,
																										javax.swing.GroupLayout.PREFERRED_SIZE,
																										60,
																										javax.swing.GroupLayout.PREFERRED_SIZE)
																								.addGap(18,
																										18,
																										18)
																								.addComponent(
																										jButtonStart))))
												.addGroup(
														layout.createSequentialGroup()
																.addGap(19, 19,
																		19)
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.LEADING)
																				.addComponent(
																						jLabelWeichenNr,
																						javax.swing.GroupLayout.PREFERRED_SIZE,
																						250,
																						javax.swing.GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						jLabelWeichenNr1,
																						javax.swing.GroupLayout.PREFERRED_SIZE,
																						250,
																						javax.swing.GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						jLabelWeichenBez,
																						javax.swing.GroupLayout.PREFERRED_SIZE,
																						250,
																						javax.swing.GroupLayout.PREFERRED_SIZE)))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabel3))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelBauwerk,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		289,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelBauwerkStationA,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		202,
																		javax.swing.GroupLayout.PREFERRED_SIZE)
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabelBauwerkStationE,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		202,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelHoeheBauwerk,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		186,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelHoehe,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		127,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabel5))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabel4))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelUeberh,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		144,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelUeberhStationA,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		202,
																		javax.swing.GroupLayout.PREFERRED_SIZE)
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabelUeberhStationE,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		202,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabel6))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelElementKruemmung,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		334,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jLabelKruemmungStationA,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		202,
																		javax.swing.GroupLayout.PREFERRED_SIZE)
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabelKruemmungStationE,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		202,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.TRAILING,
																				false)
																				.addComponent(
																						jLabelBauwBes,
																						javax.swing.GroupLayout.Alignment.LEADING,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						jLabelElementKruemmungNext,
																						javax.swing.GroupLayout.Alignment.LEADING,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						jLabelElementUeberh,
																						javax.swing.GroupLayout.Alignment.LEADING,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE)
																				.addComponent(
																						jLabelElementHoehe,
																						javax.swing.GroupLayout.Alignment.LEADING,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						495,
																						Short.MAX_VALUE)))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addComponent(
																		jScrollPane1,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		1130,
																		javax.swing.GroupLayout.PREFERRED_SIZE))
												.addGroup(
														layout.createSequentialGroup()
																.addContainerGap()
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.LEADING)
																				.addComponent(
																						jLabel7)
																				.addComponent(
																						jLabelGleisAbstand,
																						javax.swing.GroupLayout.PREFERRED_SIZE,
																						201,
																						javax.swing.GroupLayout.PREFERRED_SIZE))
																.addGap(319,
																		319,
																		319)
																.addComponent(
																		jButtonClose)))
								.addContainerGap(367, Short.MAX_VALUE)));
		layout.setVerticalGroup(layout
				.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addContainerGap()
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.TRAILING)
												.addGroup(
														layout.createSequentialGroup()
																.addComponent(
																		jLabel1)
																.addGap(23, 23,
																		23)
																.addComponent(
																		jComboBoxGleis,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		javax.swing.GroupLayout.DEFAULT_SIZE,
																		javax.swing.GroupLayout.PREFERRED_SIZE)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.BASELINE)
																				.addComponent(
																						jLabel2)
																				.addComponent(
																						jTextFieldS0,
																						javax.swing.GroupLayout.PREFERRED_SIZE,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						javax.swing.GroupLayout.PREFERRED_SIZE)
																				.addComponent(
																						jButtonStart,
																						javax.swing.GroupLayout.PREFERRED_SIZE,
																						30,
																						javax.swing.GroupLayout.PREFERRED_SIZE))
																.addGap(34, 34,
																		34)
																.addComponent(
																		jLabel3)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelBauwerk)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.BASELINE)
																				.addComponent(
																						jLabelBauwerkStationA)
																				.addComponent(
																						jLabelBauwerkStationE))
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelHoeheBauwerk)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelBauwBes)
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabel4)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelHoehe)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelElementHoehe)
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabel5)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelUeberh)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelElementUeberh)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.BASELINE)
																				.addComponent(
																						jLabelUeberhStationA)
																				.addComponent(
																						jLabelUeberhStationE))
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabel6)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelElementKruemmung)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.BASELINE)
																				.addComponent(
																						jLabelKruemmungStationA)
																				.addComponent(
																						jLabelKruemmungStationE))
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelElementKruemmungNext)
																.addGap(18, 18,
																		18)
																.addComponent(
																		jLabel7)
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.RELATED)
																.addComponent(
																		jLabelGleisAbstand))
												.addComponent(
														jButtonClose,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														34,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addGap(18, 18, 18)
								.addComponent(jScrollPane1,
										javax.swing.GroupLayout.PREFERRED_SIZE,
										136,
										javax.swing.GroupLayout.PREFERRED_SIZE)
								.addGap(18, 18, 18)
								.addComponent(jLabelWeichenNr)
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(jLabelWeichenNr1)
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.RELATED)
								.addComponent(jLabelWeichenBez)
								.addContainerGap(189, Short.MAX_VALUE)));

		pack();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == jButtonStart) {
			if (isValidInput()) {
				clearLabel();
				showResult();
				saveResult();
			}
		} else if (e.getSource() == jButtonClose) {
			setVisible(false);
			dispose();
		}
	}

	/**
	 * Prüfen ob s0 innerhalb des Datenbestandes liegt
	 * 
	 * @return
	 */
	private boolean isValidInput() {
		double s0 = jTextFieldS0.getValue();
		double s1 = Manager.getInstance().getKruemmungslinienElemente().first()
				.getStationierungInMeter();
		double s2 = Manager.getInstance().getKruemmungslinienElemente().last()
				.getEndstationierungInMeter();
		if (s0 < s1) {
			JOptionPane.showMessageDialog(this, StationException,
					"Stationierung außerhalb des Datenbestandes",
					JOptionPane.WARNING_MESSAGE);
			return false;
		}
		if (s0 > s2) {
			JOptionPane.showMessageDialog(this, StationException,
					"Stationierung außerhalb des Datenbestandes",
					JOptionPane.WARNING_MESSAGE);
			return false;
		}
		return true;
	}

	/**
	 * Speichern der Ergebnisse
	 */
	public void saveResult() {
		// Ergebnisse in .csv und .txt speichern
		// Speicherpfad analog zum Pfad der gewählten Projektdatei
	}

	/**
	 * Suche nach Ergenissen zu s0
	 */
	public void showResult() {
		double s0 = jTextFieldS0.getValue();
		if (s0 != 0) {
			QueryResult result = Manager.getInstance().query(s0);
			BauwerkslinienDAO bauwerk = result
					.getNearestBauwerkslinienElement();
			if (bauwerk != null) {
				if (bauwerk.getStationierungBisInMeter() == bauwerk
						.getStationierungVonInMeter()) {
					// Das naheste Bauwerk innerhalb 5m ausgeben
					if (Math.abs(s0 - bauwerk.getStationierungVonInMeter()) <= 5) {
						jLabelBauwerk.setText("Bauwerk: "
								+ bauwerk.getBauwerk());
						jLabelBauwerkStationA.setText("Stationierung von: "
								+ format2.format(bauwerk
										.getStationierungVonInMeter()));
						if (bauwerk.getStationierungBisInMeter() == bauwerk
								.getStationierungVonInMeter()) {

						} else {
							jLabelBauwerkStationE.setText("Stationierung bis: "
									+ format2.format(bauwerk
											.getStationierungBisInMeter()));
						}
						if (bauwerk.getHoeheInMeter() != 0) {
							jLabelHoeheBauwerk.setText("Höhe: "
									+ bauwerk.getHoeheInMeter());
						} else {
							jLabelHoeheBauwerk.setText("Höhe: ");
						}
						jLabelBauwBes.setText("Besonderheiten: "
								+ bauwerk.getBesonderheiten());
					}
				} else {
					if (s0 >= bauwerk.getStationierungVonInMeter() - 5
							&& s0 <= bauwerk.getStationierungBisInMeter() + 5) {
						jLabelBauwerk.setText("Bauwerk: "
								+ bauwerk.getBauwerk());
						jLabelBauwerkStationA.setText("Stationierung von: "
								+ format2.format(bauwerk
										.getStationierungVonInMeter()));
						jLabelBauwerkStationE.setText("Stationierung bis: "
								+ format2.format(bauwerk
										.getStationierungBisInMeter()));
						if (bauwerk.getHoeheInMeter() != 0) {
							jLabelHoeheBauwerk.setText("Höhe: "
									+ bauwerk.getHoeheInMeter());
						} else {
							jLabelHoeheBauwerk.setText("Höhe: ");
						}
						jLabelBauwBes.setText("Besonderheiten: "
								+ bauwerk.getBesonderheiten());
					}
				}
			}

			HoehenlinienDAO hoehenlinienElement = result
					.getNearestHoehenlinienElement();
			if (hoehenlinienElement != null) {
				double s = hoehenlinienElement.getStationierungInMeter();
				double h = hoehenlinienElement.gethoehe();
				double hoeheBer = 0;
				double m1 = hoehenlinienElement.getNeigungAn();
				double m2 = hoehenlinienElement.getNeigungAb();
				int ra = hoehenlinienElement.getRa() != 0 ? hoehenlinienElement
						.getRa() : 0;
				double lt = hoehenlinienElement.getLt() != 0
						? hoehenlinienElement.getLt()
						: 0;
				double a = hoehenlinienElement.getA() != 0
						? hoehenlinienElement.getA()
						: 0;
				// NW mit Ausrundung
				if (ra != 0) {
					// s0 fällt nicht mit NW zusammen
					if (s0 != s) {
						// s0 kleiner StationNW, innerhalb der Ausrundung
						if ((s - lt) < s0 && s0 < s) {
							if (m2 < m1) {
								jLabelElementHoehe
										.setText("Ausrundungsbereich - Kuppe");
								hoeheBer = h - (m1 * lt) / 1000
										- (s0 - (s - lt)) * (m1 / 1000)
										- Math.pow((s0 - (s - lt)), 2)
										/ (2 * ra);
								jLabelHoehe.setText("Höhe: "
										+ format1.format(hoeheBer));
							} else {
								jLabelElementHoehe
										.setText("Ausrundungsbereich - Wanne");
								hoeheBer = h - (m1 * lt) / 1000
										+ (s0 - (s - lt)) * (m1 / 1000)
										+ Math.pow((s0 - (s - lt)), 2)
										/ (2 * ra);
								jLabelHoehe.setText("Höhe: "
										+ format1.format(hoeheBer));
							}
							// s0 größer StationNW, innerhalb Ausrundung
						} else if (s < s0 && (s + lt) > s0) {
							if (m2 < m1) {
								jLabelElementHoehe
										.setText("Ausrundungsbereich - Kuppe");
								hoeheBer = h + (m2 * lt) / 1000
										- ((s + lt) - s0) * (m2 / 1000)
										- Math.pow(((s + lt) - s0), 2)
										/ (2 * ra);
								jLabelHoehe.setText("Höhe: "
										+ format1.format(hoeheBer));
							} else {
								jLabelElementHoehe
										.setText("Ausrundungsbereich - Wanne");
								hoeheBer = h + (m2 * lt) / 1000
										+ ((s + lt) - s0) * (m2 / 1000)
										+ Math.pow(((s + lt) - s0), 2)
										/ (2 * ra);
								jLabelHoehe.setText("Höhe: "
										+ format1.format(hoeheBer));
							}
							// s0 kleiner StationNW, außerhalb der Ausrundung
						} else if (s0 < (s - lt)) {
							hoeheBer = h - (m1 * (s - s0)) / 1000;
							jLabelHoehe.setText("Höhe: "
									+ format1.format(hoeheBer));
							jLabelElementHoehe.setText("Neigungsbereich");
							// s0 größer StationNW, außerhalb Ausrundung
						} else if (s0 > (s + lt)) {
							hoeheBer = h + (m2 * (s0 - s)) / 1000;
							jLabelHoehe.setText("Höhe: "
									+ format1.format(hoeheBer));
							jLabelElementHoehe.setText("Neigungsbereich");
						}
					} else {
						if (m2 < m1) {
							jLabelElementHoehe
									.setText("Ausrundungsbereich - Kuppe");
							hoeheBer = h + a;
							jLabelHoehe.setText("Höhe: "
									+ format1.format(hoeheBer));
						} else {
							jLabelElementHoehe
									.setText("Ausrundungsbereich - Wanne");
							hoeheBer = h + a;
							jLabelHoehe.setText("Höhe: "
									+ format1.format(hoeheBer));
						}
					}
				} else {
					// s0 im Neigungsbereich
					if (s0 != s) {
						if (s0 < s) {
							hoeheBer = h - (m1 * (s - s0)) / 1000;
							jLabelHoehe.setText("Höhe: "
									+ format1.format(hoeheBer));
							jLabelElementHoehe.setText("Neigungsbereich");
						} else {
							hoeheBer = h + (m2 * (s0 - s)) / 1000;
							jLabelHoehe.setText("Höhe: "
									+ format1.format(hoeheBer));
							jLabelElementHoehe.setText("Neigungsbereich");
						}
					} else {
						jLabelHoehe
								.setText("Höhe: " + format1.format(hoeheBer));
						jLabelElementHoehe.setText("Neigungswechsel");
					}
				}
			}
			KruemmungslinienDAO kruemmungsElement = result
					.getNearestKruemmungslinienElement();
			if (kruemmungsElement != null) {
				jLabelKruemmungStationA.setText("Station von: "
						+ format2.format(kruemmungsElement
								.getStationierungInMeter()));
				jLabelKruemmungStationE.setText("Station bis: "
						+ format2.format(kruemmungsElement
								.getEndstationierungInMeter()));
				jLabelElementKruemmung.setText("Element: "
						+ kruemmungsElement.getElement());
				if (kruemmungsElement.getRadius() != 0) {
					jLabelElementKruemmungNext.setText("Radius: "
							+ kruemmungsElement.getRadius());
				} else if (kruemmungsElement.getRp() != 0) {
					jLabelElementKruemmungNext.setText("Beta: "
							+ kruemmungsElement.getRp() + "gon");
				} else if (kruemmungsElement.getLaengeUeBogen() != 0) {
					jLabelElementKruemmungNext.setText(kruemmungsElement
							.getUebergangsbogen()
							+ " Länge: "
							+ kruemmungsElement.getLaengeUeBogen());
				}
			}
			UeberhoehungslinienDAO ueberhoehungsElement = result
					.getNearestUeberhoehungslinienElement();
			if (ueberhoehungsElement != null) {
				UeberhoehungslinienDAO prevUeberhoehungsElement = result
						.getPrevUeberhoehungslinienElement();
				UeberhoehungslinienDAO nextUeberhoehungsElement = result
						.getNextUeberhoehungslinienElement();

				jLabelUeberhStationA.setText("Station von: "
						+ ueberhoehungsElement.getStationierungInMeterUe());
				jLabelUeberhStationE.setText("Station bis: "
						+ ueberhoehungsElement.getEndstationierungInMeterUE());
				jLabelUeberh.setText("Überhöhung: 0");
				double sr = ueberhoehungsElement.getStationierungInMeterUe();
				int up = 0;
				if (prevUeberhoehungsElement != null) {
					if (prevUeberhoehungsElement.getUeberhoehungInMM() != 0) {
						up = prevUeberhoehungsElement.getUeberhoehungInMM();
					}
				}
				int un = 0;
				double l2 = 0;
				if (nextUeberhoehungsElement != null) {
					if (nextUeberhoehungsElement.getUeberhoehungInMM() != 0) {
						un = nextUeberhoehungsElement.getUeberhoehungInMM();
					}
					if (nextUeberhoehungsElement.getLaengeRampe() != 0) {
						l2 = nextUeberhoehungsElement.getLaengeRampe();
					}
				}
				double lr = ueberhoehungsElement.getLaengeRampe() != 0
						? ueberhoehungsElement.getLaengeRampe()
						: 0;
				int uBer = 0;
				if (lr != 0) {
					if (ueberhoehungsElement.getUeberhoehungsrampe().toString()
							.equals("RA")) {
						jLabelElementUeberh.setText("RA  Länge: " + lr);
						uBer = (int) (((s0 - sr) * un) / lr);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RAs")) {
						jLabelElementUeberh.setText("RAs  Länge: " + lr);
						uBer = (int) ((2 * (s0 - sr) * (s0 - sr) * un) / lr);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RAss")) {
						jLabelElementUeberh.setText("RAss  Länge: " + lr);
						uBer = (int) (up - (up / (lr * lr)) * (lr - s0)
								* (lr - s0));
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("REss")) {
						jLabelElementUeberh.setText("RAss  Länge: " + lr);
						uBer = (int) (up - (up / (lr * lr)) * (lr - s0)
								* (lr - s0));
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RAB")) {
						jLabelElementUeberh.setText("RAB  Länge: " + lr);
						uBer = (int) (((3 * (s0 - sr) * (s0 - sr)) / (lr * lr) - (2
								* (s0 - sr) * (s0 - sr) * (s0 - sr))
								/ (lr * lr * lr)) * un);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RABs")) {
						uBer = (int) (up - (up / (lr * lr)) * (lr - s0)
								* (lr - s0));
						uBer = (int) (((3 * (s0 - sr) * (s0 - sr)) / (lr * lr) - (2
								* (s0 - sr) * (s0 - sr) * (s0 - sr))
								/ (lr * lr * lr)) * un);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("REBs")) {
						uBer = (int) (up - (up / (lr * lr)) * (lr - s0)
								* (lr - s0));
						uBer = (int) (((3 * (s0 - sr) * (s0 - sr)) / (lr * lr) - (2
								* (s0 - sr) * (s0 - sr) * (s0 - sr))
								/ (lr * lr * lr)) * un);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RE")) {
						jLabelElementUeberh.setText("RE  Länge: " + lr);
						uBer = (int) (up - ((s0 - sr) * up) / lr);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("REs")) {
						jLabelElementUeberh.setText("REs  Länge: " + lr);
						uBer = (int) (up - (2 * (s0 - sr) * (s0 - sr) * up)
								/ lr);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("REB")) {
						jLabelElementUeberh.setText("REB  Länge: " + lr);
						uBer = (int) (up - ((3 * (s0 - sr) * (s0 - sr))
								/ (lr * lr) - (2 * (s0 - sr) * (s0 - sr) * (s0 - sr))
								/ (lr * lr * lr))
								* up);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RE")
							&& nextUeberhoehungsElement.getUeberhoehungsrampe()
									.toString().equals("RA")) {
						jLabelElementUeberh.setText("Gleisschere RE-RA");
						uBer = (int) ((up * (lr + l2)) * l2);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					} else if (ueberhoehungsElement.getUeberhoehungsrampe()
							.toString().equals("RA")
							&& nextUeberhoehungsElement.getUeberhoehungsrampe()
									.toString().equals("RE")) {
						jLabelElementUeberh.setText("Gleisschere RA-RE");
						uBer = (int) ((up * (lr + l2)) * l2);
						jLabelUeberh.setText("Überhöhung: " + uBer);
					}
				} else if (ueberhoehungsElement.getUeberhoehungInMM() != 0) {
					jLabelUeberh.setText("Überhöhung: "
							+ ueberhoehungsElement.getUeberhoehungInMM());
					jLabelElementUeberh
							.setText("Element: konstante Überhöhung");
				}
			}
			LageskizzenWeichenDAO weiche = result.getNearestWeiche();
			if (weiche != null) {
				if (Math.abs(s0 - weiche.getstationWeiche()) <= 100) {
					jLabelWeichenNr.setText("WeichenNr: "
							+ weiche.getnummerWeiche());
					jLabelWeichenNr1.setText("Stationierung: "
							+ weiche.getstationWeiche());
					jLabelWeichenBez.setText("WeichenBez: "
							+ weiche.getbezWeiche());
				}
			}
			List<LageskizzenGVPDAO> nearestGVPs = result.getNearestGVPs();
			table.setLageskizzenGVPs(nearestGVPs);

			if (table.getRowCount() > 1) {
				String g1 = (table.getValueAt(0, 9)).toString();
				g1 = g1.replace(',', '.');
				double dg1 = Double.valueOf(g1);
				String g2 = (table.getValueAt(1, 9)).toString();
				g2 = g2.replace(',', '.');
				double dg2 = Double.valueOf(g2);
				if (dg1 != 0 && dg2 != 0) {
					double s = dg1 - dg2;
					String stationLinks1 = (table.getValueAt(0, 1)).toString();
					stationLinks1 = stationLinks1.replace(',', '.');
					double sL1 = Double.valueOf(stationLinks1);
					String stationLinks2 = (table.getValueAt(1, 1)).toString();
					stationLinks2 = stationLinks2.replace(',', '.');
					double sL2 = Double.valueOf(stationLinks2);
					double a = sL2 - sL1;
					double b = s0 - sL1;
					double g = (s / a) * b + dg1;
					jLabelGleisAbstand.setText("Gleisabstand: " + g);
				}
			} else if (table.getRowCount() == 1) {
				String l1 = (table.getValueAt(0, 9)).toString();
				l1 = l1.replace(',', '.');
				double g = Double.valueOf(l1);
				jLabelGleisAbstand.setText("Gleisabstand: " + g);
			}
		}
	}

	// Zurücksetzen der Darstellung für die Ergebnisse
	public void clearLabel() {
		jLabelBauwerk.setText("Bauwerk:");
		jLabelBauwerkStationA.setText("Stationierung von: ");
		jLabelBauwerkStationE.setText("Stationierung bis: ");
		jLabelHoeheBauwerk.setText("Höhe: ");
		jLabelBauwBes.setText("Besonderheiten: ");
		jLabelHoehe.setText("Höhe = ");
		jLabelElementHoehe.setText("Element:");
		jLabelUeberh.setText("Überhöhung = 0");
		jLabelWeichenNr.setText("WeichenNr: ");
		jLabelWeichenNr1.setText("Stationierung: ");
		jLabelWeichenBez.setText("WeichenBez: ");
		jLabelElementHoehe.setText("Element: ");
		jLabelKruemmungStationA.setText("Station von: ");
		jLabelKruemmungStationE.setText("Station bis: ");
		jLabelElementKruemmung.setText("Element: ");
		jLabelElementKruemmungNext.setText("");
		jLabelUeberhStationA.setText("Station von: ");
		jLabelUeberhStationE.setText("Station bis: ");
		jLabelElementUeberh.setText("Element: ");
		jLabelGleisAbstand.setText("Gleisabstand: ");
		table.clear();
	}

	private javax.swing.JButton jButtonClose;

	private javax.swing.JButton jButtonStart;

	@SuppressWarnings("rawtypes")
	private javax.swing.JComboBox jComboBoxGleis;

	private javax.swing.JLabel jLabel1;

	private javax.swing.JLabel jLabel2;

	private javax.swing.JLabel jLabel3;

	private javax.swing.JLabel jLabel4;

	private javax.swing.JLabel jLabel5;

	private javax.swing.JLabel jLabel6;

	private javax.swing.JLabel jLabel7;

	private javax.swing.JLabel jLabelBauwBes;

	private javax.swing.JLabel jLabelBauwerk;

	private javax.swing.JLabel jLabelBauwerkStationA;

	private javax.swing.JLabel jLabelBauwerkStationE;

	private javax.swing.JLabel jLabelElementHoehe;

	private javax.swing.JLabel jLabelElementKruemmung;

	private javax.swing.JLabel jLabelElementKruemmungNext;

	private javax.swing.JLabel jLabelElementUeberh;

	private javax.swing.JLabel jLabelGleisAbstand;

	private javax.swing.JLabel jLabelHoehe;

	private javax.swing.JLabel jLabelHoeheBauwerk;

	private javax.swing.JLabel jLabelKruemmungStationA;

	private javax.swing.JLabel jLabelKruemmungStationE;

	private javax.swing.JLabel jLabelUeberh;

	private javax.swing.JLabel jLabelUeberhStationA;

	private javax.swing.JLabel jLabelUeberhStationE;

	private javax.swing.JLabel jLabelWeichenBez;

	private javax.swing.JLabel jLabelWeichenNr;

	private javax.swing.JLabel jLabelWeichenNr1;

	private javax.swing.JScrollPane jScrollPane1;

	private LageskizzenGVPTable table;

	private DoubleTextField jTextFieldS0;

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getSource() == jButtonStart) {
			if (e.getKeyCode() == KeyEvent.VK_ENTER) {
				jButtonStart.doClick();
			}
		} else if (e.getSource() == jButtonClose) {
			if (e.getKeyCode() == KeyEvent.VK_ENTER) {
				jButtonClose.doClick();
			}
		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {

	}

	@Override
	public void keyTyped(KeyEvent arg0) {

	}

}
